import {
  NestInterceptor,
  ExecutionContext,
  BadGatewayException,
  CallHandler,
} from '@nestjs/common';
import {
  Observable, of,
  tap,
  timeout, catchError,
  throwError
} from 'rxjs';
import { Request } from 'express'


/**
 * 超时拦截器 如果没有在规定的 ( 2s ) 时间内响应 则报错
 */
export class TimeoutInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    const request = context.switchToHttp().getRequest<Request>() // 获取请求对象
    return next.handle().pipe(
      timeout(2000), // 如果上游可观察对象在 2s 内没有发送一个值，则它将触发一个超时错误
      catchError(err => { // 捕获上游可观察对象的错误 返回一个新的可观察对象
        if (err.name === 'TimeoutError') { // 如果是一个超时错误
          // 返回一个发送BadGatewayException错误的可观察对象
          return of(new BadGatewayException('请求超时'))
        }
        // 返回一个发送错误的可观察对象
        return throwError(() => err)
      })
    )
  }
}
